package ktvdownloadserver

import (
	"encoding/binary"
	"fmt"
	"ktvserver/core/tcpserver"
	"ktvserver/ktvutil/videopath"
	"os"
)

//////////////////////////////////////////////////////////////////////////////////////
// 处理电影文件请求
//////////////////////////////////////////////////////////////////////////////////////

// 获取电影文件信息
func KtvMovieFileInfo(w tcpserver.ResponseWriter, req *tcpserver.Request) {

	fmt.Println("KtvMovieFileInfo enter ...")
	defer fmt.Println("KtvMovieFileInfo leave ...")

	info := tcpserver.GetKtvRequestInfo(req.DataBody)

	// 获取视频文件路径
	srcFilePath := videopath.GetSongVideoPath(info.Number, info.Ext[:])

	var dataLength uint32

	// 获取文件的信息
	if fi, err := os.Stat(srcFilePath); err != nil {
		// 找不到文件直接发送空数据
		dataLength = 0
	} else {
		dataLength = uint32(fi.Size())
	}

	tcpserver.WriteHeader(w, 4, 0)
	binary.Write(w, binary.LittleEndian, &dataLength)
	tcpserver.WriteFooter(w)

}

// 获取电影文件数据
func KtvMovieFileData(w tcpserver.ResponseWriter, req *tcpserver.Request) {

	fmt.Println("KtvMovieFileData enter ...")
	defer fmt.Println("KtvMovieFileData leave ...")

	info := tcpserver.GetKtvRequestInfo(req.DataBody)

	// 获取视频文件路径
	srcFilePath := videopath.GetSongVideoPath(info.Number, info.Ext[:])

	// 获取文件的信息
	fi, err := os.Stat(srcFilePath)
	if err != nil || fi.Size() <= 0 {
		// 找不到文件直接发送空数据
		tcpserver.WriteHeader(w, 0, 0)
		tcpserver.WriteFooter(w)
		return
	}

	// 计算发送的长度
	offset, length := tcpserver.CalcuteTransferParam(fi.Size(), int64(info.Start), int64(info.Length))

	// 发送文件数据
	tcpserver.WriteHeader(w, uint32(length), 0)
	tcpserver.WriteFile(w, srcFilePath, offset, length)
	tcpserver.WriteFooter(w)

}

// 电影文件继续传输
func KtvMovieFileContinue(w tcpserver.ResponseWriter, req *tcpserver.Request) {

	fmt.Println("KtvMovieFileContinue enter ...")
	defer fmt.Println("KtvMovieFileContinue leave ...")

	info := tcpserver.GetKtvRequestInfo(req.DataBody)

	// 获取视频文件路径
	srcFilePath := videopath.GetSongVideoPath(info.Number, info.Ext[:])

	// 获取文件的信息
	fi, err := os.Stat(srcFilePath)
	if err != nil || fi.Size() <= 0 {
		// 找不到文件直接发送空数据
		tcpserver.WriteHeader(w, 0, 0)
		tcpserver.WriteFooter(w)
		return
	}

	// 计算发送的长度
	offset, length := tcpserver.CalcuteTransferParam(fi.Size(), int64(info.Start), int64(info.Length))

	// 发送文件数据
	tcpserver.WriteFile(w, srcFilePath, offset, length)

}
